package com.personal.gateway.flinkAllCommand.configurationOption.configurationType;

import com.personal.gateway.flinkAllCommand.configurationOption.ConfigurationOption;
import lombok.Getter;

/**
 * @author BigHead
 * @date 2022/1/10 15:00
 * @description AbstractConfigurationType
 */
@Getter
public abstract class AbstractConfigurationType<BT> {
    /**
     * 参数类型
     */
    protected final Class<BT> configurationType;
    /**
     * 样例数据
     */
    protected BT[] exampleValue;
    /**
     * 参数值
     */
    protected BT value;
    /**
     * 参数最小值
     */
    protected BT minValue;
    /**
     * 参数最大值
     */
    protected BT maxValue;

    public AbstractConfigurationType(Class<BT> configurationType) {
        this.configurationType = configurationType;
    }

    /**
     * 范围值
     *
     * @param minValue 最小值
     * @param maxValue 最大值
     */
    public void setMinMaxValue(BT minValue, BT maxValue) {
        this.minValue = minValue;
        this.maxValue = maxValue;
    }
//
//    /**
//     * 刷新样例数据
//     */
//    public void flushExampleValues(){
//        this.setExampleValue();
//    }

    /**
     * 返回类型字符串
     *
     * @return 类型字符串描述
     */
    public abstract String getTypeString();

    /**
     * 写入参数
     *
     * @param value 参数值
     */
    public abstract void setValue(BT value);

    /**
     * 写入样例数据
     *
     * @param exampleValue 样例数据
     */
    public abstract void setExampleValue(BT... exampleValue);

    /**
     * 通过前提条件获取样例数据
     *
     * @param configurationOption 参数类型对象
     * @return 返回参数指定类型
     */
    public abstract BT[] getExampleValue(ConfigurationOption<?, ?> configurationOption);
}
